﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using FinanSoft.Entities;

namespace PoSWebService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IPointOfSaleServiceContract
    {

        /// <summary>
        /// Método que se encaga de revisar si hubo error o no
        /// </summary>
        /// <returns>Retorna un booleano de si hubo error o no</returns>
        [OperationContract]
        bool IsError();

        /// <summary>
        /// Método que se encaga de obtener el mensaje de error
        /// </summary>
        /// <returns>Retorna el mensaje de error</returns>
        [OperationContract]
        String GetErrorMessage();

        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// cliente que está ingresando en el sistema
        /// </summary>
        /// <param name="username">Nombre de usuario del cliente</param>
        /// <param name="password">Contraseña del cliente</param>
        /// <returns>Retorna la cuenta auxiliar asociada a ese cliente (como información)</returns>
        [OperationContract]
        AuxiliarAccount LogIn(String username, String password, String company);

        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// cajero que está ingresando
        /// </summary>
        /// <param name="username">Nombre de usuario del cajero</param>
        /// <param name="password">Contraseña del cajero</param>
        /// <returns>Indica si la persona se logró autenticar exitosamente</returns>
        [OperationContract]
        bool LogInCashier(String username, String password, String company);

        /// <summary>
        /// Obtiene las sucursales
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        AuxiliarAccount[] GetBranches();

        /// <summary>
        /// Método que se encarga de obtener las bodegas registradas en el sistema
        /// </summary>
        /// <returns>Retorna la lista de objetos bodega</returns>
        [OperationContract]
        List<StoreRoom> GetStoreRooms();

        /// <summary>
        /// Método que se encarga de obtener todos los artículos que hay en el sistema
        /// además de su información: bodega en donde está, el stock disponible, etc...
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        List<Item> GetItems();

        /// <summary>
        /// Método que se encaga de obtener el impuesto por defecto para un artículo
        /// </summary>
        /// <returns>Retorna un objeto Impuesto con su respectiva información</returns>
        [OperationContract]
        Tax GetDefaultTax();

        /// <summary>
        /// Método que se encarga de crear un documento para su revision previa a su registro
        /// </summary>
        /// <param name="docType">Acrónimo del tipo de documento que és (OC, OV, EM...)</param>
        /// <param name="idAuxiliarAccount">Id de la cuenta mayor del cliente o proveedor al que está asociado</param>
        /// <param name="postingDate">Fecha de contabilización</param>
        /// <param name="deliveryExpDate">Fecha de vencimiento o de entrega</param>
        /// <param name="idMoneda">Id de la moneda en que está el documento</param>
        /// <param name="idDocBase">Id del documento base, si no tiene manda -1</param>
        /// <param name="amountBeforeTax">Monto antes de impuestos</param>
        /// <param name="taxAmount">Monto de impuestos</param>
        /// <param name="totalAmount">Monto después de impuestos</param>
        /// <returns>Retorna el documento generico creado a partir de los parametros pasados</returns>
        [OperationContract]
        Document PreviewInvoiceDocument(int idAuxiliarAccount, DateTime postingDate, DateTime deliveryExpDate, int idMoneda, double amountBeforeTax, double taxAmount, double totalAmount, List<FinanSoft.Entities.DocDetail> details);
        
        /// <summary>
        /// Método que se encarga de guardar la factura cliente y hacer el pago de la misma
        /// </summary>
        /// <param name="doc">La factura cliente generada previamente para ser revisada por el método PreviewInvoiceDocument</param>
        /// <returns></returns>
        [OperationContract]
        bool SaveClienInvoiceDocument(Document doc);

        /// <summary>
        /// Método que se encarga de obtener las monedas disponibles en el sistema
        /// </summary>
        /// <returns>Retorna la lista de Monedas</returns>
        [OperationContract]
        List<Currency> GetCurrencies();
    }
}
